
Aloísio Vítor
Image Processing Expert

Web scraping là một phương pháp được sử dụng để trích xuất dữ liệu từ các trang web. Trong Golang, thư viện Colly là một công cụ phổ biến để web scraping nhờ vào tính đơn giản và tính năng mạnh mẽ. Hướng dẫn này sẽ dẫn bạn qua việc thiết lập một dự án Golang với Colly, xây dựng một trình trích xuất cơ bản, xử lý các tình huống trích xuất dữ liệu phức tạp và tối ưu trình trích xuất của bạn với các yêu cầu đồng thời.
Trước khi bắt đầu, hãy đảm bảo rằng bạn đã cài đặt Go trên hệ thống của mình. Khởi tạo dự án của bạn và tải về gói Colly với các lệnh sau:
go mod init my_scraper
go get -u github.com/gocolly/colly
Điều này thiết lập thư mục dự án của bạn và cài đặt gói Colly.
Nhận Mã Khuyến Mãi CapSolver
Tăng ngân sách tự động hóa của bạn ngay lập tức!
Sử dụng mã khuyến mãi CAPN khi nạp tiền vào tài khoản CapSolver để nhận thêm 5% khuyến mãi cho mỗi lần nạp — không giới hạn.
Nhận mã khuyến mãi ngay bây giờ trong Bảng điều khiển CapSolver
.
Hãy tạo một trình trích xuất cơ bản để trích xuất tất cả các liên kết từ một trang Wikipedia cụ thể.
main.go và thêm mã sau:package main
import (
"fmt"
"github.com/gocolly/colly"
)
func main() {
c := colly.NewCollector(
colly.AllowedDomains("en.wikipedia.org"),
)
c.OnHTML(".mw-parser-output", func(e *colly.HTMLElement) {
links := e.ChildAttrs("a", "href")
fmt.Println(links)
})
c.Visit("https://en.wikipedia.org/wiki/Web_scraping")
}
Mã này khởi tạo một bộ thu thập Colly bị giới hạn bởi en.wikipedia.org, sau đó thiết lập một hàm gọi lại để tìm và in tất cả các liên kết bên trong phần div .mw-parser-output của trang.
Đối với các nhiệm vụ phức tạp hơn như trích xuất dữ liệu bảng và ghi nó vào tệp CSV, bạn có thể sử dụng gói encoding/csv trong Go:
main.go với mã sau để trích xuất dữ liệu bảng:package main
import (
"encoding/csv"
"log"
"os"
"github.com/gocolly/colly"
)
func main() {
fName := "data.csv"
file, err := os.Create(fName)
if err != nil {
log.Fatalf("Could not create file, err: %q", err)
return
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
c := colly.NewCollector()
c.OnHTML("table.wikitable", func(e *colly.HTMLElement) {
e.ForEach("tr", func(_ int, row *colly.HTMLElement) {
rowData := []string{}
row.ForEach("td", func(_ int, cell *colly.HTMLElement) {
rowData = append(rowData, cell.Text)
})
writer.Write(rowData)
})
})
c.Visit("https://en.wikipedia.org/wiki/List_of_programming_languages")
}
Mã này trích xuất dữ liệu bảng từ một trang Wikipedia và ghi nó vào tệp data.csv.
Để tăng tốc độ trích xuất, bạn có thể thực hiện các yêu cầu đồng thời bằng cách sử dụng goroutines của Go. Dưới đây là cách bạn có thể trích xuất nhiều trang đồng thời:
package main
import (
"fmt"
"github.com/gocolly/colly"
"sync"
)
func scrape(url string, wg *sync.WaitGroup) {
defer wg.Done()
c := colly.NewCollector()
c.OnHTML("title", func(e *colly.HTMLElement) {
fmt.Println("Title found:", e.Text)
})
c.Visit(url)
}
func main() {
var wg sync.WaitGroup
urls := []string{
"https://en.wikipedia.org/wiki/Web_scraping",
"https://en.wikipedia.org/wiki/Data_mining",
"https://en.wikipedia.org/wiki/Screen_scraping",
}
for _, url := range urls {
wg.Add(1)
go scrape(url, &wg)
}
wg.Wait()
}
Trong ví dụ này, chúng ta định nghĩa một hàm scrape nhận một URL và một nhóm chờ như các tham số. Hàm này khởi tạo một bộ thu thập Colly, thiết lập một hàm gọi lại để in tiêu đề của trang, và truy cập URL. Hàm main tạo một nhóm chờ, lặp qua danh sách các URL và khởi chạy một goroutine cho mỗi URL để trích xuất dữ liệu đồng thời.
Bằng cách tuân theo các bước này, bạn có thể xây dựng các trình trích xuất mạnh mẽ trong Golang sử dụng Colly, xử lý nhiều tình huống trích xuất dữ liệu khác nhau và tối ưu hiệu suất với các yêu cầu đồng thời. Để có các hướng dẫn chi tiết hơn và sử dụng nâng cao, hãy kiểm tra các tài nguyên về web scraping với Go và Colly.
Ngoài Colly, có một số thư viện tuyệt vời khác cho web scraping trong Golang:
Web scraping là kỹ năng mạnh mẽ và thiết yếu để trích xuất dữ liệu hiệu quả từ các trang web. Sử dụng Golang và thư viện Colly, bạn có thể xây dựng các trình trích xuất mạnh mẽ có thể xử lý nhiều tình huống trích xuất dữ liệu, từ việc thu thập các liên kết đơn giản đến trích xuất dữ liệu bảng phức tạp và tối ưu hiệu suất với các yêu cầu đồng thời.
Trong hướng dẫn này, bạn đã học cách:
Bằng cách tuân theo các bước này, bạn có thể tạo ra các trình trích xuất web hiệu quả và hiệu quả trong Golang, tận dụng tính đơn giản và tính năng mạnh mẽ của Colly. Để sử dụng nâng cao và hướng dẫn chi tiết hơn, hãy khám phá các tài nguyên bổ sung về web scraping với Go và Colly.
Có. Colly được thiết kế để đơn giản và thân thiện với người mới, đồng thời vẫn cung cấp các tính năng mạnh mẽ như phân tích DOM, xử lý yêu cầu, hàm gọi lại và tính đồng thời. Người mới phát triển Go có thể nhanh chóng xây dựng một trình trích xuất hoạt động chỉ với vài dòng mã.
Tuyệt đối. Colly cho phép chọn các nút HTML cụ thể và thuộc tính, điều này giúp việc trích xuất bảng, danh sách, liên kết và các phần tử có cấu trúc khác trở nên dễ dàng. Bạn cũng có thể lưu kết quả trực tiếp vào các tệp như CSV hoặc JSON bằng các thư viện chuẩn của Go.
Bạn có thể sử dụng goroutines của Go để xử lý nhiều trang cùng lúc. Bằng cách khởi chạy các trình trích xuất đồng thời và đồng bộ chúng bằng một nhóm chờ, hiệu suất trích xuất tăng lên đáng kể — đặc biệt là đối với các tập dữ liệu lớn hoặc các nhiệm vụ quét nhiều URL.
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Tự động hóa việc giải CAPTCHA với Nanobot và CapSolver. Sử dụng Playwright để giải reCAPTCHA và Cloudflare tự động.
